"""
@Author  : 康帅
@Time    : 2021/6/16 11:22
@Function: 
"""

import functools

"""
functools 模块中提供的主要工具是 partial 类，
它可以用来包装一个可调用对象，使其具有默认参数。
生成的对象也是一个可调用对象，并且可以把它当做原来的函数。
新生成的可调用对象可接受和原有函数完全一样的参数，
并且可以在调用时接受额外的位置参数或关键词参数。
partial 可以代替 lambda 为函数参数提供默认值，
并同时留下一些没有指定默认值的参数
"""


def my_func(a, b=2):
    """my_func()的文档字符串"""
    print('调用my_func的参数', (a, b))


def show_detail(name, f, is_partial=False):
    """显示一个可调用对象的细节"""
    print("{}:".format(name))
    print("对象:", f)
    if not is_partial:
        print("__name__", f.__name__)
    if is_partial:
        print("func", f.func)
        print("args", f.args)
        print("keywords", f.keywords)
    return


show_detail("my_func", my_func)
my_func('a', 3)
print()

# 为参数 b 设置另一个默认值
# 但要求调用者提供参数 a
p1 = functools.partial(my_func, b=4)
show_detail('默认关键词参数的偏对象', p1, True)
p1('传递参数a')
p1('覆盖参数b', b=5)
print()

# 为参数 a 与 b 都设置默认值
p2 = functools.partial(my_func, '默认的参数 a', b=99)
show_detail('多个默认值的偏对象', p2, True)
p2()
p2(b='覆盖参数b')
print()

print('参数不足：')
p1()
